rm(list = ls())
library(tidyverse)
library(plotly)
library(DT)
Para datos categóricos, las proporciones simples o porcentajes cuentan la historia de los datos.
Palabras claves:
Moda: La categoría o valor que ocurre con más frecuencia en un conjunto de datos.
Valor esperado: Cuando las categorías se pueden asociar con un valor numérico, esto da un valor basado en la probabilidad de ocurrencia de una categoría.
Bar-plot: La frecuencia o proporción de cada categoría trazada como barras.
Pie-plot: La frecuencia o proporción de cada categoría representada como cuñas en un pastel.
Obtener un resumen de una variable binaria o una variable categórica con algunas categorías es algo bastante fácil: solo calculamos la proporción de 1s, o las proporciones de las categorías.
Bar-plot: Recordemos que los bar-plots son una herramienta visual común para mostrar una única variable categórica. Las categorías se enumeran en el eje \(x\) y las frecuencias o proporciones en el eje \(y\).
aptos <- read_csv('https://raw.githubusercontent.com/lacamposm/Fundamentos_Analitica/main/data/APARTAMENTOS.csv')
datatable(aptos)
Eliminamos columna no necesaria.
str(data.frame(aptos))
## 'data.frame': 694 obs. of 11 variables:
## $ precio : num 79 93 100 123 135 140 145 160 160 175 ...
## $ mt2 : num 43.2 56.9 66.4 61.9 89.8 ...
## $ ubicacion : chr "norte" "norte" "norte" "norte" ...
## $ estrato : num 3 2 3 2 4 3 3 3 4 4 ...
## $ alcobas : num 3 2 2 3 3 3 2 3 4 3 ...
## $ banos : num 1 1 2 2 2 2 2 2 2 2 ...
## $ balcon : chr "si" "si" "no" "si" ...
## $ parqueadero : chr "si" "si" "no" "si" ...
## $ administracion: num 0.05 0.069 0 0.13 0 0.12 0.14 0.127 0 0.123 ...
## $ avaluo : num 14.9 27 15.7 27 39.6 ...
## $ terminado : chr "no" "si" "no" "no" ...
Revisión de valores nulos:
apply(is.na(aptos), 2, sum)
## precio mt2 ubicacion estrato alcobas
## 0 0 0 0 0
## banos balcon parqueadero administracion avaluo
## 0 0 0 0 0
## terminado
## 0
Tabla de frecuencias:
## Tenemos información.
aptos %>% group_by(terminado) %>%
summarise(frecuencias = n()) %>%
mutate(frec_porcent = frecuencias/sum(frecuencias)) %>%
arrange(desc(frecuencias)) %>%
mutate(across(frec_porcent, round, 3))
## # A tibble: 2 × 3
## terminado frecuencias frec_porcent
## <chr> <int> <dbl>
## 1 si 592 0.853
## 2 no 102 0.147
Un bar-plot de la variable ubicacion:
Por ejemplo, el plot anterior muestra la cantidad de elementos en cada una de las ubicación de los apartamentos en cuestión.
El siguiente plot muestra el porcentaje de los apartamentos en la muestra que están o no terminados.
Nota: Tenga en cuenta que un bar-plot se parece a un histograma; en un bar-plot, el eje \(x\) representa diferentes categorías de una feature de tipo factor, mientras que en un histograma, el eje \(x\) representa valores de una sola variable en una escala numérica. Además, en un histograma, las barras normalmente se muestran tocándose entre sí, en un bar-plot, las barras se muestran separadas unas de otras. Finalmente, la conversión de datos numéricos a categóricos datos es un paso importante y ampliamente utilizado en el análisis de datos, ya que reduce la complejidad (y el tamaño) de los datos. Esto ayuda en el descubrimiento de las relaciones entre las características, en particular en las etapas iniciales de un análisis.
Moda
La moda es el valor, o valores en caso de empate, que aparece con mayor frecuencia en los datos. Por ejemplo, la moda de la ubicación en los apartamentos es ‘poblado’. Como otro ejemplo, en la mayor parte de Colombia, la moda de la preferencia religiosa sería católica. La moda es un resumen estadístico simple para datos categóricos, y generalmente no se usa para datos numéricos.
Valor esperado.
Un tipo especial de datos categóricos son los datos en los que las categorías representan o pueden asignarse a valores discretos en la misma escala. Un comercializador de una nueva tecnología en la nube, por ejemplo, ofrece dos niveles de servicio, uno a un precio de \(\$300/mes\) y otro a \(\$50/mes\). El comercializador ofrece seminarios web gratuitos para generar clientes potenciales, y las cifras que tiene la empresa deter,imam que el 5% de los asistentes se inscribirá en el servicio de \(\$300\), el \(15\%\) se inscribirá en el servicio de $50 servicio, y el 80% no se suscribirá a nada. Estos datos se pueden resumir, para fines financieros, en un único “valor esperado”, que es una forma de media ponderada, en la que los pesos son probabilidades.
El valor esperado se calcula de la siguiente manera:
En el ejemplo del servicio en la nube, el valor esperado de un asistente al seminario web es, por lo tanto, \(\$22,50\) por mes, calculado de la siguiente manera: \[EV=(0.05)(300)+(0.15)(50)+(0.80)(0)=22.5\]
El valor esperado es realmente una forma de media ponderada: agrega las ideas de futuras expectativas y pesos de probabilidad, a menudo basados en juicios subjetivos. El valor esperado es un concepto fundamental en la valoración de empresas y el presupuesto de capital, por ejemplo, el valor esperado de cinco años de ganancias de una nueva adquisición, o el ahorros de costos esperados del nuevo software de gestión de pacientes en una clínica.
Probabilidad.
Nos referimos anteriormente a la probabilidad de que ocurra un valor. La mayoría de las personas tienen una comprensión intuitiva de la probabilidad y se encuentran con el concepto con frecuencia, pronósticos (la probabilidad de lluvia) o análisis deportivos (la probabilidad de ganar). Por ejemplo si la probabilidades de que un equipo gane es 2 a 1, su probabilidad de ganar es 2/(2+1)= 2/3. Un primer concepto puede ser: la probabilidad de que ocurra un evento es la proporción de veces que ocurrirá si la situación podría repetirse una y otra vez, innumerables veces. La mayoría de las veces se trata de una construcción imaginaria, pero es una comprensión operativa adecuada de la probabilidad.
Vamos a generar un reporte de la tabla
APARTAMENTOS.csv.
Una vista general del dataframe muestra lo siguiente:
## # A tibble: 5 × 11
## precio mt2 ubicacion estrato alcobas banos balcon parqu…¹ admin…² avaluo
## <dbl> <dbl> <chr> <dbl> <dbl> <dbl> <chr> <chr> <dbl> <dbl>
## 1 1100 500 poblado 6 3 3 si si 1.6 713.
## 2 260 137 belen guayab… 4 3 4 si si 0.297 150
## 3 600 156 poblado 6 3 4 no si 0.535 451
## 4 235 87 aburra sur 4 3 2 si si 0.147 95
## 5 498 253 poblado 6 3 3 si si 0.532 405.
## # … with 1 more variable: terminado <chr>, and abbreviated variable names
## # ¹parqueadero, ²administracion
## 'data.frame': 694 obs. of 11 variables:
## $ precio : num 79 93 100 123 135 140 145 160 160 175 ...
## $ mt2 : num 43.2 56.9 66.4 61.9 89.8 ...
## $ ubicacion : chr "norte" "norte" "norte" "norte" ...
## $ estrato : num 3 2 3 2 4 3 3 3 4 4 ...
## $ alcobas : num 3 2 2 3 3 3 2 3 4 3 ...
## $ banos : num 1 1 2 2 2 2 2 2 2 2 ...
## $ balcon : chr "si" "si" "no" "si" ...
## $ parqueadero : chr "si" "si" "no" "si" ...
## $ administracion: num 0.05 0.069 0 0.13 0 0.12 0.14 0.127 0 0.123 ...
## $ avaluo : num 14.9 27 15.7 27 39.6 ...
## $ terminado : chr "no" "si" "no" "no" ...
El dataset contiene 694 registros en 11 features, sin datos nulos. Tenemos al parecer 7 variables de tipo numérico y 4 character.
Recordemos que summary() genera un resumen estadístico
básico del dataset:
summary(aptos)
## precio mt2 ubicacion estrato
## Min. : 25.0 Min. : 26.0 Length:694 Min. :2.000
## 1st Qu.: 160.0 1st Qu.: 71.0 Class :character 1st Qu.:4.000
## Median : 245.0 Median : 97.5 Mode :character Median :5.000
## Mean : 317.8 Mean :120.9 Mean :4.651
## 3rd Qu.: 380.0 3rd Qu.:141.8 3rd Qu.:6.000
## Max. :1700.0 Max. :500.0 Max. :6.000
## alcobas banos balcon parqueadero
## Min. : 1.000 Min. :1.00 Length:694 Length:694
## 1st Qu.: 3.000 1st Qu.:2.00 Class :character Class :character
## Median : 3.000 Median :2.00 Mode :character Mode :character
## Mean : 2.911 Mean :2.29
## 3rd Qu.: 3.000 3rd Qu.:3.00
## Max. :14.000 Max. :6.00
## administracion avaluo terminado
## Min. :0.0000 Min. : 0.149 Length:694
## 1st Qu.:0.0900 1st Qu.: 73.000 Class :character
## Median :0.2010 Median : 131.431 Mode :character
## Mean :0.2636 Mean : 182.637
## 3rd Qu.:0.3750 3rd Qu.: 234.051
## Max. :2.2800 Max. :1540.620
Note que no tenemos ninguna vivienda de estrato 1. Además, tenemos propiedades de hasta 14 alcobas. El rango de los precios va desde 25 unidades monetatrias y hasta las 1700.
¿ Qué sucede con las variables que NO son de tipo numérico?
# aptos %>% select_if(is.character) %>% Seleccionar por tipo columna
aptos_1 <- aptos%>%mutate_if(is.character, as.factor)
Seleccionemos las variables solo de tipo categórico:
temp <- aptos_1 %>% select_if(is.factor)
summary(temp)
## ubicacion balcon parqueadero terminado
## aburra sur :169 no:185 no:126 no:102
## belen guayabal: 67 si:509 si:568 si:592
## centro : 38
## laureles : 73
## norte : 10
## occidente : 69
## poblado :268
El resumen anterior, muestra para cada feature categórica un pequeño resumen. Es este se muestran la cantidad de valores únicos en cada feature, así como la moda y la cantidad de ocurrencias de dicha moda. Note que aunque el estrato tiene ingresos numéricos, esta realmente se trabajada con una feature cualitativa ordinal.
## [1] "Conteo por estratos:"
## summary(aptos$estrato)
## 2 8
## 3 161
## 4 138
## 5 145
## 6 242
Veamos como se distribuyen los precios en la variable precio en el sector del poblado
aptos %>% filter(ubicacion == "poblado") %>%
plot_ly(x = ~precio, type = "histogram",
marker = list(color = "rgb(100,50,100)",line = list(color = "skyblue", width = 1))) %>%
layout( barmode="stack", bargap=0.02, title = "Distribución precios aptos: Sector poblado.", yaxis = list(title="Conteo"), template = "plotly_dark")
Ahora, en el sector del centro.
aptos %>% filter(ubicacion == "centro") %>%
plot_ly(x = ~precio, nbinsx = 10, type = "histogram",
marker = list(color = "rgb(100,50,50)", line = list(color = "skyblue", width = 1))) %>%
layout(barmode="stack", bargap=0.02, title = "Distribución precios aptos: Sector centro",
yaxis = list(title="Conteo"), plot_bgcolor = "skyblue")
El plot anterior muestra que la distribución de precios es sesgada a la derecha, es decir la mayor parte de la información se concentra a la izquierda del plot.
Veamos ambos plots en uno solo:
aptos %>% filter(ubicacion %in% c("centro", "poblado")) %>%
ggplot() +
aes(precio, colour = ubicacion) +
geom_density() +
xlim(0, 2500)
aptos %>% filter(ubicacion %in% c("centro", "poblado")) %>%
ggplot() +
aes(precio, colour = ubicacion) +
geom_boxplot() +
theme(axis.ticks.y = element_blank(), axis.text.y = element_blank())
Más aún, podemos comparar la distribución de todas las ubicaciones:
ggplot(aptos) +
aes(x = ubicacion, y = precio) +
geom_boxplot()
Las zonas del ‘poblado’ y ‘laureles’ son las más costosas, en contraste ‘centro’ y ‘norte’ las que tienen precios más bajos.
Exploramos la descripción de variables categóricas, se observó como estas puedes ser un factor para discriminar grupos y ser comparados.